
/**
 * @file    json_options.h
 * @details
 * @author
 * @date
 * @version
 */

#ifndef __JSON_OPTIONS_H__
#define __JSON_OPTIONS_H__

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>

typedef enum
{
    INVALID_TYPE = -1,
    NULL_TYPE = 0,
    INTEGER_TYPE,
    BOOLEAN_TYPE,
    STRING_TYPE,
    OBJECT_TYPE,
    ARRAY_TYPE,
} VALUE_TYPE_E;

typedef enum
{
    False = 0,
    True,

} jsonBool;

typedef struct jsonObj
{
    char *key;
    char *value;
    int valType;
    int nextIdx;
    int count;
} jsonObj;

typedef struct jsonPack
{
    int pos;
    struct jsonPack *next;
} jsonPack;

typedef struct jsonPack_t
{
    jsonPack *root;
    jsonPack *prev;
} jsonPack_t;

typedef struct
{
    jsonObj *_jsonParseNodeList; // 解析用节点数组
    char *_packJsonMem;          // 打包用空间
    int _jsonParseNodeIndex;     // 解析已用节点数
    int _packUseLenght;          // 打包已用长度
    jsonPack_t _g_jsonPack;      // json打包时用的指针
    int _JSON_parse_node_count;  // 解析json用的节点数
    int _PACK_json_cache_size;   // 打包json用的空间
} Jsonoptions_handler;

// parse json string
jsonObj *jsonParse(Jsonoptions_handler *handler, char *str);

// array
jsonObj *jsonArray(Jsonoptions_handler *handler, jsonObj *root, const char *key);
jsonObj *getJsonArrObject(Jsonoptions_handler *handler, jsonObj *root, int index);
char *getJsonArrString(Jsonoptions_handler *handler, jsonObj *root, int index);
int getJsonArrInteger(Jsonoptions_handler *handler, jsonObj *root, int index);
float getJsonArrFloat(Jsonoptions_handler *handler, jsonObj *root, int index);

// object
jsonObj *jsonObject(Jsonoptions_handler *handler, jsonObj *root, const char *key);
char *getJsonObjString(Jsonoptions_handler *handler, jsonObj *obj, const char *key);
int getJsonObjInteger(Jsonoptions_handler *handler, jsonObj *obj, const char *key);
float getJsonObjFloat(Jsonoptions_handler *handler, jsonObj *obj, const char *key);
int getJsonObjBoolean(Jsonoptions_handler *handler, jsonObj *obj, const char *key);

// release block
void jsonRelease(Jsonoptions_handler *handler, jsonObj *root);

// print json object
void printJsonObj(Jsonoptions_handler *handler, jsonObj *obj);

// package json
void createJsonPack(Jsonoptions_handler *handler, jsonPack *root);
int addJsonStrPair(Jsonoptions_handler *handler, jsonPack *root, const char *key, const char *val);
int addJsonIntPair(Jsonoptions_handler *handler, jsonPack *root, const char *key, int num);
int addJsonBoolPair(Jsonoptions_handler *handler, jsonPack *root, const char *key, jsonBool Bool);
int addJsonObject(Jsonoptions_handler *handler, jsonPack *root, const char *key, jsonPack *obj);
int addJsonArray(Jsonoptions_handler *handler, jsonPack *root, const char *key, jsonPack *obj);
int addJsonStrArr(Jsonoptions_handler *handler, jsonPack *root, const char *val);
int addJsonObjArr(Jsonoptions_handler *handler, jsonPack *root, jsonPack *obj);
int addJsonIntArr(Jsonoptions_handler *handler, jsonPack *root, int num);
char *getPackJsonString(Jsonoptions_handler *handler);

// 初始化句柄
void json_handler_defult(Jsonoptions_handler *handler);
#endif /* __JSON_OPTIONS_H__ */
